﻿
#pragma once
#include <stdio.h>
#include <iostream>
#include <stdbool.h>
#define _CRT_SECURE_NO_WARNINGS 1
using namespace std;

class Date
{
	friend ostream& operator<<(ostream& out, const Date& d);
	friend istream& operator>>(istream& in, Date& d);
public:


	//打印时间
	/*void Get_date() const
	{
		cout << _year << "年" << _month << "月" << _day << "日"<<endl;
	}*/

	// 获取某年某月的天数

	int GetMonthDay(int year, int month) const
	{
		const int arr[] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };
		if ((month == 2) && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
		{
			return 29;
		}
		return arr[month];

	}

	bool CheckDate()
	{
		if (_month < 1 || _month > 12
			|| _day < 1 || _day > GetMonthDay(_year, _month))
		{
			return false;
		}
		else
		{
			return true;
		}
	}

	//获取类成员
	/*int Get_year() const
	{
		return _year;
	}
	int Get_month() const
	{
		return _month;

	}
	int Get_day() const
	{
		return _day;
	}*/


	// 全缺省的构造函数

	Date(int year = 1900, int month = 1, int day = 1);



	// 拷贝构造函数


	Date(const Date& d);



	// 赋值运算符重载

  // d2 = d3 -> d2.operator=(&d2, d3)

	Date& operator=(const Date& d);


	// 析构函数

	~Date();


	// 日期+=天数
	Date& operator+=(int day); 

	// 日期+天数
	Date operator+(int day) const;



	// 日期-天数

	Date operator-(int day) const;



	// 日期-=天数

	Date& operator-=(int day);



	// 前置++

	Date& operator++();



	// 后置++

	Date operator++(int);



	// 后置--

	Date operator--(int);



	// 前置--

	Date& operator--();



	// >运算符重载

	bool operator>(const Date& d) const;



	// ==运算符重载

	bool operator==(const Date& d) const;



	// >=运算符重载

	bool operator >= (const Date& d) const;



	// <运算符重载

	bool operator < (const Date& d) const;



	// <=运算符重载

	bool operator <= (const Date& d) const;



	// !=运算符重载

	bool operator != (const Date& d) const;



	// 日期-日期 返回天数

	int operator-(const Date& d) const;

private:

	int _year;

	int _month;

	int _day;

};


